home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
ada
/
gwuada_7.zip
/
ADAHELP.C
< prev
next >
Wrap
Text File
|
1993-12-01
|
30KB
|
1,071 lines
/*
HELP ENGINE PARA GWADA
Módulo ADAHELP.C
Programa para mostrar helps referentes à linguagem ADA.
O arquivo de help GWADA.HLP deve ser gerado através do
programa ADAHCONV.EXE.
Trabalho de conclusao
Bacharelado em Informática
Ulrich Peters
Rafael Presotto
Jerry Dressler
Revisoes:
/03 Início do trabalho
/04 Reformulaçao completa do sistema de acesso ao help, definiçao do
ambiente da Help-Engine (janela/sombra/botoes...)
/05 Introduçao das funçoes de mouse
/06 Barra de rolagem e ativaçao desta pelo mouse, testes dos desvios
/08 Testes com alocaçao estática/dinâmica de memória - erro
provável no tamanho do registro de linha de help
15/08 Verificaçao do sistema gráfico acoplado - atributos de sublinhado
e highlight para monitores MDA/Hercules e cores para sist. coloridos
09/09 Revisao das funçoes do mouse para o caso de driver nao estar instalado
13/09 Volta para a mesma posiçao (scroll) anterior ao ativar ALT-F1,
modificaçao das mensagens de erro, início das procuras por strings
passados como parâmetro de chamada
16/09 Correçao no vetor de chamadas de help (31 posiçoes em vez de 30!)
/10 Excecuçao da procura de tokens, montar tokenbuffer (help virtual) para
o string passado como parâmetro, desvio direto para help se houver
apenas um desvio localizado.
/11 Revisao completa nas estruturas de alocacao dinâmica e testes finais
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>
#include <dos.h>
#include <ctype.h>
#include "..\source\gwadahlp.h"
#include "..\source\adavio.h"
#include "..\source\mouse.h"
#define destaca_desvio(pointer) (VioColor(pointer->screen_Xi,pointer->screen_Y+scroll, pointer->screen_Xf,pointer->screen_Y+scroll, attrib.select))
#define desmarca_desvio(pointer) (VioColor(pointer->screen_Xi,pointer->screen_Y+scroll, pointer->screen_Xf,pointer->screen_Y+scroll, attrib.desvio))
/* Estrutura usada para guardar uma linha de texto de auxílio */
typedef struct helpline
{
struct helpline *prox;
char helptext[77];
};
/* Estrutura única para guardar os vários atributos de cor usados */
typedef struct cores
{
char normal; /* texto normal do help */
char hilight; /* texto destacado */
char desvio; /* texto de desvio */
char dimmed; /* texto escuro (inativo) */
char select; /* texto selecionado */
char slider0; /* barra de rolagem */
char slider1; /* cursor da barra de rolagem */
};
/* listas globais */
struct desvio *desvio_mostrado;
struct helpline *hlptxt;
struct cores attrib;
int chamadas[31]; /* vetor das chamadas efetuadas p/ backtracking */
int cham_scr[31]; /* vetor da posiçao do help na tela */
int chmds; /* número de chamadas de helps anteriores */
/* outras variáveis globais */
FILE *help; /* arquivo GWADA.HLP */
int mouse=0; /* controle: driver instalado? */
int ha_desvio;
int sliderpos; /* posiçao do slider */
int ALT_F1, TAB, ENTER; /* variáveis para controlar os buttons */
int scroll_pos; /* posiçao do help na tela */
char far *tokenbuffer; /* buffer que simula help de tokens achados */
int tokenlines; /* linhas achadas por search() */
/* Funçoes de controle do mouse */
void mouse_on(void)
{
if (mouse)
mouse_enable();
}
void mouse_off(void)
{
if (mouse)
mouse_disable();
}
/* Rotina para terminar com erro */
void end(char *texto, int exitcode)
{
int posicao;
char pre[70];
if (texto != "")
{
if (exitcode != 2)
strcpy(pre,"Memory Fault: ");
else
strcpy(pre,"");
strcat(pre,texto);
posicao = 40-strlen(pre)/2;
VioSombra(posicao-1,9,45+(40-posicao),13);
VioFill(posicao-3,8,43+(40-posicao),12,' ',0x4F);
VioFrame(posicao-3,8,43+(40-posicao),12,0,0x4F);
VioPrint(posicao,10,0x4F,0,pre);
while (! kbhit());
}
while (kbhit())
posicao = getch(); /* Limpar buffer do teclado */
VioWinClose(1); /* Fechar janela e restaura tela */
_setcursortype(_NORMALCURSOR); /* retornar cursor */
exit(exitcode);
}
/* Sinal acústico para erro */
void beep(void)
{
sound(500);
delay(10);
nosound();
}
/* Buscar lista de helps disponíveis do disco
(Informaçoes do cabeçalho do arquivo) */
void ler_nodos(void)
{
int qtde; /* número de nodos */
int i;
struct tree *nodo_antes;
raiz = NULL;
fread(&qtde,2,1,help); /* recuperar número de nodos do arquivo */
nodo_antes = NULL;
nodo_atual = malloc(sizeof(struct tree));
for (i=0;i<qtde;i++) /* recuperar os nodos no início do help */
{
fread(&nodo_atual->number,2,1,help);
fread(&nodo_atual->lines,2,1,help);
fread(&nodo_atual->size,4,1,help);
fread(&nodo_atual->offset,4,1,help);
nodo_atual-> prox = NULL;
if (raiz == NULL) raiz = nodo_atual;
nodo_antes = nodo_atual;
nodo_atual = malloc(sizeof(struct tree));
nodo_antes->prox = nodo_atual;
}
nodo_antes->prox = NULL;
free(nodo_atual); /* eliminar a última criaçao de nodo */
}
/* Extrair do buffer de memória o texto do help,
montando a lista encadeada dos desvios e
a lista de texto de help (scrolling) */
void process_buffer(char far *buffer, int linhas)
{
int pos, n, x, i;
char numero[5];
struct helpline *texto, *linha_anterior;
/* Inicializa ponteiros da listas */
hlptxt = NULL; /* raiz dos helps */
draiz = NULL; /* raiz dos desvios */
braiz = NULL; /* raiz dos brancos */
linha_anterior = NULL;
desvio_antes = NULL;
branco_antes = NULL;
i=0;
for (x=0;x<linhas;x++)
{
/* alocar memória para a texto */
texto = (struct helpline *)farmalloc(sizeof(struct helpline));
if (texto == NULL)
end("HELPLINE",1);
pos = 0;
while (buffer[i] != '\n')
{
if (buffer[i] == '\\') /* início de sequência de controle */
{
switch (buffer[++i])
{
case 'u' : /* alocar nodo na árvore de brancos */
i++;
branco_atual = (struct branco *)farmalloc(sizeof(struct branco));
if (branco_atual == NULL)
end("HILIGHTED TEXT LIST",1);
branco_atual->screen_Xi = pos+2;
branco_atual->screen_Y = x+2; /* 2 = margem da moldura! */
while ((buffer[i] != '\\')&&(pos < 76))
texto->helptext[pos++] = buffer[i++];
branco_atual->screen_Xf = pos+1;
i += 2;
branco_atual->prox = NULL;
if (braiz == NULL)
braiz = branco_atual;
if (branco_antes != NULL)
branco_antes->prox = branco_atual;
branco_antes = branco_atual;
break;
case 'v' : /* alocar nodo da arvore de desvios */
i++;
desvio_atual = (struct desvio *)farmalloc(sizeof(struct desvio));
if (desvio_atual == NULL)
end("TRANSFER LIST",1);
desvio_atual->screen_Xi = pos+2;
desvio_atual->screen_Y = x+2; /* 2 = margem da moldura! */
while ((buffer[i] != '\\')&&(pos < 76))
texto->helptext[pos++] = buffer[i++];
desvio_atual->screen_Xf = pos+1;
i += 2; /* pular o '\v' */
/* extrair o número do desvio */
n=0;
while (buffer[i] != '.')
numero[n++] = buffer[i++];
i++; /* pular o '.' */
numero[n] = '\0';
desvio_atual->number = atoi(numero);
if (numero == 0) /* linha invalida: apaga destaque */
free(desvio_atual);
else
{
desvio_atual->prox = NULL;
if (draiz == NULL)
draiz = desvio_atual;
if (desvio_antes != NULL)
desvio_antes->prox = desvio_atual;
desvio_antes = desvio_atual;
}
break;
}
}
if (pos < 76)
texto->helptext[pos++] = buffer[i];
i++;
}
/* encontrou um caractere \n */
i++;
if (pos)
texto->helptext[pos-1] = '\0';
else
texto->helptext[pos] = '\0';
texto->prox = NULL;
if (hlptxt == NULL)
hlptxt = texto;
if (linha_anterior != NULL)
linha_anterior->prox = texto;
linha_anterior = texto;
}
}
/* Funçoes de controle da régua de botoes */
void tab(int ativar)
{
mouse_off();
if (ativar)
{
TAB = 1;
VioColor(36,21,41,21,attrib.desvio); /* TAB ativo */
}
else
{
TAB = 0;
VioColor(36,21,41,21,attrib.dimmed); /* TAB inativo */
}
mouse_on();
}
void enter(int ativar)
{
mouse_off();
if (ativar)
{
ENTER = 1;
VioColor(52,21,57